| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 | using System.Collections.Generic;using ExternPropertyAttributes;using JetBrains.Annotations;using UnityEditor;using UnityEngine;#if UNITY_2023_3_OR_NEWERusing UnityEngine.Rendering.Universal;#elseusing UnityEngine.Experimental.Rendering.Universal;#endifnamespace FlatKit {#if UNITY_EDITOR[CustomEditor(typeof(ObjectOutlineRendererFeature))]public class ObjectOutlineRendererFeatureEditor : Editor {    private bool _advancedSettingsFoldout;    public override void OnInspectorGUI() {        var feature = target as ObjectOutlineRendererFeature;        if (feature == null) return;#if !UNITY_2022_3_OR_NEWER        EditorGUILayout.Space();        EditorGUILayout.HelpBox("This feature requires Unity 2022.3 or newer.", MessageType.Error);        EditorGUILayout.Space(-10);#else        // Default properties.        _advancedSettingsFoldout = EditorGUILayout.Foldout(_advancedSettingsFoldout, "Advanced Settings");        if (_advancedSettingsFoldout) {            EditorGUI.indentLevel++;            // Style the background of the foldout.            EditorGUILayout.BeginVertical("HelpBox");            base.OnInspectorGUI();            EditorGUILayout.EndVertical();            EditorGUI.indentLevel--;        }        // Custom properties.        var autoReferenceMaterials =            serializedObject.FindProperty(nameof(ObjectOutlineRendererFeature.autoReferenceMaterials));        EditorGUI.indentLevel--;        autoReferenceMaterials.boolValue = EditorGUILayout.ToggleLeft(            new GUIContent(autoReferenceMaterials.displayName, autoReferenceMaterials.tooltip),            autoReferenceMaterials.boolValue);        EditorGUI.indentLevel++;        if (autoReferenceMaterials.boolValue) {            EditorGUI.indentLevel++;            EditorGUI.BeginDisabledGroup(true);            EditorGUILayout.BeginVertical("HelpBox");            var materials = serializedObject.FindProperty(nameof(ObjectOutlineRendererFeature.materials));            EditorGUILayout.PropertyField(materials, true);            EditorGUILayout.EndVertical();            EditorGUI.EndDisabledGroup();            EditorGUI.indentLevel--;        }#endif    }}#endifpublic class ObjectOutlineRendererFeature : RenderObjects {    [ReadOnly]    [Tooltip("Materials using this feature. The list is updated automatically based on the `Enable Outline` toggle " +             "on materials using the Stylized Surface shader.")]    [HideInInspector]    [SerializeField]    public List<Material> materials = new();    [Tooltip("Keep track of materials using outlines and automatically delete this feature if no materials use it." +             "If disabled, you must manually remove this feature when no materials use it.")]    [HideInInspector]    [SerializeField]    public bool autoReferenceMaterials = true;    public override void Create() {#if UNITY_2022_3_OR_NEWER        settings.overrideMode = RenderObjectsSettings.OverrideMaterialMode.Shader;        settings.overrideShader = Shader.Find("FlatKit/Stylized Surface");        settings.overrideShaderPassIndex = 1;#endif        settings.filterSettings.LayerMask = -1;        settings.filterSettings.PassNames = new[] { "Outline" };        if (autoReferenceMaterials) {            // Remove any invalid materials.            materials.RemoveAll(m => m == null);        } else {            materials.Clear();        }        base.Create();    }    // Returns true if there are any materials using this feature.    [MustUseReturnValue]    public bool RegisterMaterial(Material material, bool active) {        if (!autoReferenceMaterials) return true;        if (active) {            if (!materials.Contains(material)) {                materials.Add(material);            }        } else {            materials.Remove(material);        }        return materials.Count > 0;    }}}
 |